import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import { getTimestamp } from '@/utils/auth'

const Timeout = 3600 // token失效时间 单位秒(默认一小时)

const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API, // /api || /prod-api
    timeout: 5000 // 设置超时时间
})

/**
 * 请求拦截器
 */
service.interceptors.request.use(config => {
    // config-请求配置
    // 统一为每个接口注入token
    if (store.getters.token) {
        // 存在token的情况下校验token是否超时
        if (isCheckTimeout()) {
            // 当前token过期 - 执行登出操作
            store.dispatch('user/logout') // 登出操作
            // 跳转到登录页
            router.push('/login')
            return Promise.reject(new Error('token超时了'))
        }
        config.headers['Authorization'] = `Bearer ${store.getters.token}`
    }
    return config
}, error => {
    return Promise.reject(new Error(error))
})

/**
 * 响应拦截器
 */
service.interceptors.response.use(response => {
    // 对返回的data解构赋值
    const { success, message, data } = response.data
    // 根据success的成功与否决定下面的操作
    if (success) {
        return data
    } else {
        // 提示错误
        Message.error(message)  
        // 业务发生错误需要进入catch
        return Promise.reject(new Error(message))
    }
}, error => {
    if (error.response && error.response.data && error.response.data.code === 10002) {
        // 当等于10002的时候 表示 后端告诉我token超时了
        store.dispatch('user/logout') // 登出action 删除token
        router.push('/login')
    } else {
        Message.error(error.message) // 提示错误信息
    }
    // 业务发生错误需要进入catch
    return Promise.reject(new Error(error))
})


/**
 * @description: 检查当前时间是否超时
 * @author: Yong
 * @function   isCheckTimeout
 * @return { boolean } 
 * @date: 2021-04-26 21:58:13
 */
function isCheckTimeout () {
    let currentTime = Date.now()        // 当前时间戳
    let timestamp = getTimestamp()      // 获取本地缓存的token注入时间戳
    return (currentTime - timestamp) / 1000 > Timeout 
}

export default service